// 2010年版权归Go作者所有。版权所有。
// 此源代码的使用受BSD样式的约束
// 可以在许可证文件中找到的许可证。

package cipher

import "io"

// Stream*对象非常简单，其所有成员都是公共的。使用者
// 你可以自己创造它们。

// StreamReader将流包装到io.Reader中。它称为XORKeyStream
// 处理通过的每个数据片。
type StreamReader struct {
	S Stream
	R io.Reader
}

func (r StreamReader) Read(dst []byte) (n int, err error) {
	n, err = r.R.Read(dst)
	r.S.XORKeyStream(dst[:n], dst[:n])
	return
}

// StreamWriter将流包装到io.Writer中。它称为XORKeyStream
// 处理通过的每个数据片。如果有任何书面通知
// 返回short，则StreamWriter不同步，必须丢弃。
// StreamWriter没有内部缓冲；关闭不需要
// 要调用以刷新写入数据。
type StreamWriter struct {
	S   Stream
	W   io.Writer
	Err error // 未使用
}

func (w StreamWriter) Write(src []byte) (n int, err error) {
	c := make([]byte, len(src))
	w.S.XORKeyStream(c, src)
	n, err = w.W.Write(c)
	if n != len(src) && err == nil { // 不应该发生
		err = io.ErrShortWrite
	}
	return
}

// 关闭关闭基础写入程序并返回其关闭返回值（如果写入程序
// 也是一个io.Closer。否则返回nil。
func (w StreamWriter) Close() error {
	if c, ok := w.W.(io.Closer); ok {
		return c.Close()
	}
	return nil
}
